#### 6.1.2 pathlib模块

## 6.1.2.1创建路径

# # 导入路径类
# from pathlib import Path

# # 相对路径或者绝对
# 对象名 = Path(相对路径或者绝对)
# # 当前工作目录的绝对路径
# 对象名 = Path.cwd()
# # 绝对路径 + 相对路径
# 对象名 = Path.cwd().joinpath("目录1","目录2")

from pathlib import Path

p = Path('.')  #当前程序路径
print([x.name for x in p.iterdir() if x.is_dir()])
#查找文件名
#['.git', 'Python核心', 'Python高级']

#当前工作目录的绝对路径
cwd = Path.cwd()
print(cwd)
#C:\Users\Administrator\gitee\python2023

## 绝对路径 + 相对路径
cwd_p = Path.cwd().joinpath("新建文件夹", "新建文件.txt")
print(cwd_p)
#C:\Users\Administrator\gitee\python2023\新建文件夹\新建文件.txt

# 6.1.2.2路径信息

# 对象名.absolute()  # 绝对路径(路径类型)
# 对象名.name  # 带后缀的完整文件名(str类型)
# 对象名.stem  # 文件名不带后缀(str类型)
# 对象名.suffix # 文件后缀(str类型)
# 对象名.parent  # 上一级路径(路径类型)
# 对象名.parts  # 分割路径(tuple类型)
# 对象名.exists()  # 路径是否存在(bool类型)
# 对象名.is_file()  # 是否文件(bool类型)
# 对象名.is_dir()  # 是否目录(bool类型)
# 对象名.is_absolute() # 是否绝对路径(bool类型)
# 对象名.stat().st_ctime  # 创建时间(时间戳)
# 对象名.stat().st_atime  # 访问时间(时间戳)
# 对象名.stat().st_mtime  # 修改的时间(时间戳)
# 对象名.stat().st_size  # 文件大小(字节Bete)

path02 = Path("./Python高级/练习/car.py")
print(path02.absolute())  # 绝对路径(路径类型)
#C:\Users\Administrator\gitee\python2023\Python高级\练习\car.py

print(path02.name)  # 带后缀的完整文件名(str类型)
#car.py

print(path02.stem)  # 文件名不带后缀(str类型)
#car

print(path02.suffix)  # 文件后缀(str类型)
#.py

print(path02.parent)  # 上一级路径(路径类型)
#Python高级\练习

print(path02.parts)  # 分割路径(tuple类型)
#('Python高级', '练习', 'car.py')

print(path02.exists())  # 路径是否存在(bool类型)
#True

print(path02.is_file())  # 是否文件(bool类型)
#True

print(path02.is_dir())  # 是否目录(bool类型)
#False

print(path02.is_absolute())  # 是否绝对路径(bool类型)
#False

import datetime


#将时间戳转换为 datetime 对象方法
def times_to_tamp(timestamp):
    dt_object = datetime.datetime.fromtimestamp(timestamp).strftime(
        '%Y-%m-%d %H:%M:%S')
    return dt_object


print(path02.stat().st_ctime)  # 创建时间(时间戳)
#1700198098.4658544
print(times_to_tamp(path02.stat().st_ctime))
#2023-11-17 13:14:58

print(path02.stat().st_atime)  # 访问时间(时间戳)
#1700359474.1577725
print(times_to_tamp(path02.stat().st_atime))
#2023-11-19 10:04:34

print(path02.stat().st_mtime)  # 修改的时间(时间戳)
#1700198388.5691333
print(times_to_tamp(path02.stat().st_mtime))
#2023-11-17 13:19:48

print(path02.stat().st_size)  # 文件大小(字节Bete)
#175

## 6.1.2.3搜索目录

#(1) 语法
# # 注意：路径对象必须是目录，不能是文件
# # 搜索当前目录所有路径(一层)
# 生成器 = 对象名.iterdir():

# # 根据通配符搜索当前目录所有路径(一层)，*表示任意多个字符
# # 例如:*.py表示所有Python文件
# 生成器 = path.glob("通配符"):

# # 根据通配符递归搜索当前目录所有路径(多层)
# 生成器 = 对象名.rglob("通配符")

##  都是可迭代的

for item in Path.cwd().glob(r"*/python*"):
    print(item)

for item in Path.cwd().rglob(r"*.py"):
    print(item)

print([item.name for item in Path.cwd().iterdir()])

#遍历指定路径下的目录或者文件
#absolute = r"F:\BaiduNetdiskDownload"  #必须是目录
abs_path = Path(".")
for item in abs_path.iterdir():
    print(item)

### 6.1.2.4新建路径

# 新建目录
#new_path = r"./Python高级/练习/06文件操作/"
path_obj = Path("Python高级", "练习", "06文件操作")
#路径可以用，号来分割

## 忽略目录存在时的报错
path_obj.mkdir(exist_ok=True)

#新建文件
#joinpath拼接路径
path_obj = path_obj.joinpath("新建文件.txt")
print(path_obj)
path_obj.touch(exist_ok=True)

##修改路径中文件名称、后缀、全称，不改变原路径
print(path_obj.with_name("新建文件2.txt"))
print(path_obj.with_stem("新建文件3"))
print(path_obj.with_suffix(".py"))
print(path_obj)

###6.1.2.5重命名

#对象名.rename(新路径对象)
path_obj02 = Path("Python高级", "练习", "06文件操作","新建文件.txt")
new_path = path_obj02.with_name("新建文件1.txt")
None if new_path.exists() else path_obj02.rename(new_path)




##6.1.2.6删除路径
# 对象名.unlink() # 删除文件(永久删除，回收站不存在)
# 对象名.rmdir() # 删除目录(目录必须为空)

import time

time.sleep(2)

new_path.unlink()

path_obj = Path("Python高级", "练习", "06文件操作")
time.sleep(2)
path_obj.rmdir()



##6.1.3 shutil
#对os模块中与文件操作相关的扩容


#6.1.3.1 拷贝

# # 拷贝文件
# shutil.copy(源文件,目标文件或目录)

# # 拷贝目录(目标目录不能存在)
# shutil.copytree(源目录,目标目录)

#拷贝文件

import shutil

new_path_obj = Path("Python高级", "练习", "shutil操作")
new_path_obj.mkdir(exist_ok=True)
old_path_obj = Path("Python高级", "练习", "car.py")
shutil.copy(old_path_obj,new_path_obj)


current_time = time.strftime("%Y_%m_%d", time.localtime())
print(current_time)

#备份
backup_path = Path("backup", current_time)
None if backup_path.exists() else shutil.copytree("Python核心",backup_path)
#shutil.copytree("Python核心",Path("backup", current_time))

old_path_obj = Path("Python高级", "练习", "加入内容：类class.py")
new_path_obj = Path("Python高级", "练习", "shutil操作", "加入内容：类class.py")
shutil.copyfile(old_path_obj,new_path_obj)



##6.1.3.2 递归删除目录(目录中包含文件)
#shutil.rmtree(路径) # 永久删除，回收站不存在
time.sleep(3)
shutil.rmtree(Path("Python高级", "练习", "shutil操作"))




##6.2 文件读写



#6.2.1.1打开文件

#对象名 = open(文件路径,"操作模式",encoding="编码方式")



#6.2.1.2读写文件

current_time = time.strftime("%H_%M_%S", time.localtime())

with open(f"{current_time}.txt","w+",encoding="utf-8") as new_flie:
    new_flie.write("文件操作")

with open(Path("Python高级", "练习", "加入内容：类class.py"),"r+",encoding="utf-8") as rfile:
    #print(rfile.read())
    for row in rfile:
        print(row)
    

#6.2.2二进制文件

with open(Path("Python高级", "练习", "img.jpg"),"rb") as img_file:
    imgs = img_file.read()

#利用读取、写入文件方式，传输文件。   
with open(Path("Python高级", "练习", "img2.jpg"),"wb+") as wimg_file:
    print(wimg_file.write(imgs))